package com.thinkgsp.jxc.service;

import java.sql.Date;
import java.util.List;

import com.thinkgsp.jxc.model.Bill;
import com.thinkgsp.jxc.model.OtherStockInBill;
import com.thinkgsp.jxc.model.OtherStockOutBill;
import com.thinkgsp.jxc.model.ProductTransferBill;
import com.thinkgsp.jxc.model.PurchaseStockInBill;
import com.thinkgsp.jxc.model.RejectStockInBill;
import com.thinkgsp.jxc.model.RejectStockOutBill;
import com.thinkgsp.jxc.model.SalesPriceDiffBill;
import com.thinkgsp.jxc.model.SalesStockOutBill;
import com.thinkgsp.jxc.model.StockInBill;
import com.thinkgsp.jxc.model.StockOutBill;
import com.thinkgsp.jxc.model.StockTransferBill;
import com.thinkgsp.jxc.persistence.BillMapper;
import com.thinkgsp.jxc.persistence.InventoryMapper;
import com.thinkgsp.jxc.persistence.ProductContactMapper;
import com.thinkgsp.jxc.persistence.mybatis.PagingResult;

/**
 * 单据业务类
 * @author evan
 *
 */
public interface BillService extends GeneralService {

	/**
	 * 本方法用于测试目的
	 * @param billMapper
	 */
	public void setBillMapper(BillMapper billMapper);
	
	/**
	 * 本方法用于测试目的
	 * @param pcMapper
	 */
	public void setProductContactMapper(ProductContactMapper pcMapper);
	
	/**
	 * 本方法用于测试目的
	 * @param invMapper
	 */
	public void setInventoryMapper(InventoryMapper invMapper);
	/**
	 * 获取单据对象
	 * @param billId
	 * @return
	 */
	public Bill getBill(Long billId);
	
	/**
	 * 查询采购入库单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<PurchaseStockInBill> findPurchaseStockInBill(Date begDate,Date endDate,Integer custId);
	
	/**
	 * 查询采购入库单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<PurchaseStockInBill> findPurchaseStockInBill(Date begDate,Date endDate,Integer custId,int start,int size);
	
	/**
	 * 查询其他入库单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<OtherStockInBill> findOtherStockInBill(Date begDate,Date endDate);
	
	/**
	 * 查询其他入库单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<OtherStockInBill> findOtherStockInBill(Date begDate,Date endDate,int start,int size);
	
	/**
	 * 查询入库退货单列表
	 * @param begDate
	 * @param endDate
	 * @return
	 */
	public List<RejectStockInBill> findRejectStockInBill(Date begDate,Date endDate,Integer custId);
	
	/**
	 * 查询入库退货单列表(分页)
	 * @param begDate
	 * @param endDate
	 * @return
	 */
	public PagingResult<RejectStockInBill> findRejectStockInBill(Date begDate,Date endDate,Integer custId,int start,int size);
	
	/**
	 * 查询入库单列表(包含采购入库单与其他入库单)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<StockInBill> findStockInBill(Date begDate,Date endDate);
	
	/**
	 * 查询入库单列表(包含采购入库单与其他入库单)(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<StockInBill> findStockInBill(Date begDate,Date endDate,int start,int size);
	
	/**
	 * 查询销售出库单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<SalesStockOutBill> findSalesStockOutBill(Date begDate,Date endDate,Integer custId);
	
	/**
	 * 查询销售出库单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<SalesStockOutBill> findSalesStockOutBill(Date begDate,Date endDate,Integer custId,int start,int size);
	
	/**
	 * 查询其他出库单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<OtherStockOutBill> findOtherStockOutBill(Date begDate,Date endDate);
	
	/**
	 * 查询其他出库单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<OtherStockOutBill> findOtherStockOutBill(Date begDate,Date endDate,int start,int size);
	
	/**
	 * 查询出库退货单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<RejectStockOutBill> findRejectStockOutBill(Date begDate,Date endDate,Integer custId);
	
	/**
	 * 查询出库退货单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<RejectStockOutBill> findRejectStockOutBill(Date begDate,Date endDate,Integer custId,int start,int size);
	
	/**
	 * 查询出库单列表(包含销售出库单与其他出库单)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<StockOutBill> findStockOutBill(Date begDate,Date endDate);
	
	/**
	 * 查询出库单列表(包含销售出库单与其他出库单)(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<StockOutBill> findStockOutBill(Date begDate,Date endDate,int start,int size);
	
	/**
	 * 查询转仓单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<StockTransferBill> findStockTransferBill(Date begDate,Date endDate);
	
	/**
	 * 查询转仓单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<StockTransferBill> findStockTransferBill(Date begDate,Date endDate,int start,int size);
	
	/**
	 * 查询产品转换单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<ProductTransferBill> findProductTransferBill(Date begDate,Date endDate);
	
	/**
	 * 查询产品转换单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public PagingResult<ProductTransferBill> findProductTransferBill(Date begDate,Date endDate,int start, int size);
	
	/**
	 * 查询销售差价单列表
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @return
	 */
	public List<SalesPriceDiffBill> findSalesPriceDiffBill(Date begDate,Date endDate,Integer custId);
	
	/**
	 * 查询销售差价单列表(分页)
	 * @param begDate 开始日期
	 * @param endDate 截止日期
	 * @param start
	 * @param size
	 * @return
	 */
	public PagingResult<SalesPriceDiffBill> findSalesPriceDiffBill(Date begDate,Date endDate,Integer custId,int start,int size);
	
	/**
	 * 保存单据
	 * @param bill
	 */
	public void saveBill(Bill bill) throws ServiceException;
	
	/**
	 * 删除单据
	 * 如果单据从未归档则直接删除，否则将删除标志设定为True
	 * @param billId
	 */
	public void deleteBill(Long billId) throws ServiceException;
	
	/**
	 * 归档单据
	 * @param bill
	 */
	public void archiveBill(Bill bill) throws ServiceException;
	
	/**
	 * 归档单据
	 * @param billId
	 * @throws ServiceException
	 */
	public void archiveBill(Long billId) throws ServiceException;
	
	/**
	 * 反归档单据
	 * @param bill
	 */
	public void unArchiveBill(Bill bill) throws ServiceException;
	
	/**
	 * 反归档单据
	 * @param billId
	 * @throws ServiceException
	 */
	public void unArchiveBill(Long billId) throws ServiceException;
	
	/**
	 * 生产单据编码
	 * @param clazz
	 * @return
	 * @throws ServiceException
	 */
	public String newNumber(@SuppressWarnings("rawtypes") Class clazz) throws ServiceException;
}
